/*************************************************************************
    > File Name: h_time.h
    > Author: 侯广臣
    > Mail: 2801059691@qq.com 
    > Created Time: 2020年11月22日 星期日 11时41分48秒
 ************************************************************************/
#ifndef _HTIME_H_
#define _HTIME_H_

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <utime.h>
#include <unistd.h>
#include <sys/types.h>
//把time_t类型的时间转换成中文类型的时间保存在strTime中，
//错误时返回-1，其它返回字符串长度
//格式为: 2020年11月05日 星期日 06时32分59秒
size_t ZhongTimeToStr(char *strTime, const time_t time);

//把time_t类型的时间转换成字符串类型的时间保存在strTime中，错误时返回负数
//错误时返回-1，其它返回字符串长度
//格式为：2020-11-05 0 06:32:59 中间0代表星期日，其它星期为1~6
size_t TimeToStr(char *strTime ,time_t time);

//把中文字符串类型的时间转换成time_t类型时间返回，错误返回-1
time_t ZhongStrToTime(const char* strTime);

//把字符串类型的时间转换成time_t类型时间返回，错误返回-1
time_t StrToTime(const char* strTime);

//修改文件时间, strTime格式为TimeToStr产生字符串格式，失败返回-1
int Utime(const char *fileName, const char *strTime);


//************************* 函数实现 ***************************//

//把time_t类型的时间转换成中文类型的时间保存在strTime中，错误时返回负数
size_t ZhongTimeToStr(char *strTime, const time_t time)
{
	if(strTime == NULL)
	{
		return -1;
	}
	struct tm* p = localtime(&time);
	if(p == NULL)
	{
		return -1;
	}
	char* wd;
	switch(p->tm_wday)
	{
		case 0: wd = "日"; break;
		case 1: wd = "一"; break;
		case 2: wd = "二"; break;
		case 3: wd = "三"; break;
		case 4: wd = "四"; break;
		case 5: wd = "五"; break;
		case 6: wd = "六"; break;
	}

	return sprintf(strTime, "%04d年%02d月%02d日 星期%s %02d时%02d分%02d秒",
			p->tm_year+1900, p->tm_mon+1, p->tm_mday, wd, p->tm_hour, p->tm_min, p->tm_sec);
}

//把time_t类型的时间转换成字符串类型的时间保存在strTime中，错误时返回负数
size_t TimeToStr(char *strTime ,time_t time)
{
	if(strTime == NULL)
	{
		return -1;
	}
	struct tm *p = localtime(&time);
	if(p == NULL)
	{
		return -1;
	}
	return sprintf(strTime, "%04d-%02d-%02d %d %02d:%02d:%02d",
			p->tm_year+1900, p->tm_mon+1, p->tm_mday, p->tm_wday, p->tm_hour, p->tm_min, p->tm_sec);
}
//把字符串类型的时间转换成time_t类型时间返回
time_t StrToTime(const char* strTime)
{
	if(strTime == NULL){
		return -1;
	}

	struct tm stm;
	memset(&stm, 0, sizeof(struct tm));
	char strNum[5];
	memset(strNum, 0, 5);
	//年份	
	strncpy(strNum, strTime, 4);
	strNum[4] = '\0';
	stm.tm_year = atoi(strNum) - 1900;
	//月份
	strncpy(strNum, strTime+5, 2);
	strNum[2] = '\0';
	stm.tm_mon = atoi(strNum) - 1;
	//这个月中的第几天
	strncpy(strNum, strTime+8, 2);
	strNum[2] = '\0';
	stm.tm_mday  = atoi(strNum);
	//小时
	strncpy(strNum, strTime+13, 2);
	strNum[2] = '\0';
	stm.tm_hour = atoi(strNum);
	//分钟
	strncpy(strNum, strTime+16, 2);
	strNum[2] = '\0';
	stm.tm_min = atoi(strNum);
	//秒
	strncpy(strNum, strTime+19, 2);
	strNum[2] = '\0';
	stm.tm_sec = atoi(strNum);

	return mktime(&stm);
}
//把字符串类型的时间转换成time_t类型时间返回，中文客串
time_t ZhongStrToTime(const char* strTime)
{
	if(strTime == NULL)
	{
		return -1;
	}

	char numStr[5];     //存放读取的数字
	struct tm stime;    //存放读取的日期信息
	memset(&stime, 0, sizeof(stime));
	memset(numStr, 0, 5);

	//读取年份
	strncpy(numStr, strTime, 4);
	numStr[4] = '\0';
	stime.tm_year = atoi(numStr) - 1900;
	//读取月份
	strncpy(numStr, strTime+7, 2);
	numStr[2] = '\0';
	stime.tm_mon = atoi(numStr) - 1;
	//读取日期
	strncpy(numStr, strTime+12, 2);
	numStr[2] = '\0';
	stime.tm_mday = atoi(numStr);
	//读取小时
	strncpy(numStr, strTime+28, 2);
	numStr[2] = '\0';
	stime.tm_hour = atoi(numStr);
	//读取分钟
	strncpy(numStr, strTime+33, 2);
	numStr[2] = '\0';
	stime.tm_min = atoi(numStr);
	//读取秒
	strncpy(numStr, strTime+38, 2);
	numStr[2] = '\0';
	stime.tm_sec = atoi(numStr);

	return mktime(&stime);
}

//修改文件时间, strTime格式为TimeToStr产生客串格式
int Utime(const char *fileName, const char *strTime)
{
	if(access(fileName, F_OK) == -1){
		return -1;
	}
	if(strTime == NULL){
		return utime(fileName, NULL);
	}
	struct utimbuf ut;
	if((ut.actime = ut.modtime = StrToTime(strTime)) == -1){
		return -1;
	}
	return utime(fileName, &ut);
}






#endif
